#ifndef OMG_DDS_STATUS_CONDITION_HPP_
#define OMG_DDS_STATUS_CONDITION_HPP_

/* Copyright (c) 2009-2010, Real-Time Innovations, Inc.
 * Copyright (c) 2010, Object Management Group, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the names of the above copyright holders nor the names of their
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL A COPYRIGHT HOLDER OR CONTRIBUTOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */


template <typename DELEGATE>
class tdds::core::StatusConditionBase : public dds::core::Condition
{
    OMG_DDS_REFERENCE_TYPE(StatusConditionBase)

public:
    /**
     * This operation defines the list of communication statuses that 
     * are taken into account to determine the trigger_value of the 
     * StatusCondition. This operation may change the trigger_value of 
     * the StatusCondition.
     * WaitSet objects behavior depend on the changes of the trigger_value 
     * of their attached conditions. Therefore, any WaitSet to which the 
     * StatusCondition is attached is potentially affected by this operation.
     * If this function is not invoked, the default list of enabled statuses 
     * includes all the statuses.
     *
     * @param status the enabled statuses
     */
    void set_enabled_statuses(const dds::core::StatusMask& mask);

    /**
     * This operation retrieves the list of communication statuses that are 
     * taken into account to determine the trigger_value of the 
     * StatusCondition. This operation returns the statuses that were 
     * explicitly set on the last call to set_enabled_statuses or, if 
     * set_enabled_statuses was never called, the default list 
     * (see Section 7.1.2.1.9.1).
     */
    const dds::core::StatusMask get_enabled_statuses();

    virtual bool get_trigger_value();

private:
    friend class OMG_DDS_STATUS_CONDITION_DELEGATE;
    DELEGATE impl_;
};


/**
 * A StatusCondition object is a specific Condition that is 
 * associated with each Entity.
 * The trigger_value of the StatusCondition depends on the communication 
 * status of that entity (e.g., arrival of data, loss of information, etc.), 
 * ‘filtered’ by the set of enabled_statuses on the StatusCondition.
 * The enabled_statuses and its relation to Listener and WaitSet is detailed
 * in “Trigger State of the StatusCondition.”
 */
template <typename ENTITY>
class dds::core::StatusCondition : public StatusConditionBase
{
    OMG_DDS_REFERENCE_TYPE(StatusCondition)

public:
    /**
     * This operation returns the Entity associated with the StatusCondition. 
     * Note that there is exactly one Entity associated with each 
     * StatusCondition.
     */
    ENTITY get_entity();
};


#endif // !defined(OMG_DDS_STATUS_CONDITION_HPP_)
